package com.gimi.cloud.bbp.common.utils;


import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * AES加密相关工具类
 * @author  xx
 * @date 2017-12-01
 * @version  1.0
 */
public class AESUtil {
    private static final String AES = "AES";
    private static String string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    public static final String CRYPT_KEY = "GIMIkejiGIMIkeji";

    /**
     * 加密
     *
     * @param
     * @return
     */
    public static byte[] encrypt(byte[] src, String key) throws Exception {
        Cipher cipher = Cipher.getInstance(AES);
        SecretKeySpec securekey = new SecretKeySpec(key.getBytes(), AES);
        //设置密钥和加密形式
        cipher.init(Cipher.ENCRYPT_MODE, securekey);
        return cipher.doFinal(src);
    }

    /**
     * 解密
     *
     * @param
     * @return
     * @throws Exception
     */
    public static byte[] decrypt(byte[] src, String key)  throws Exception  {
        Cipher cipher = Cipher.getInstance(AES);
        //设置加密Key
        SecretKeySpec securekey = new SecretKeySpec(key.getBytes(), AES);
        //设置密钥和解密形式
        cipher.init(Cipher.DECRYPT_MODE, securekey);
        return cipher.doFinal(src);
    }

    /**
     * 二行制转十六进制字符串
     *
     * @param b
     * @return
     */
    public static String byte2hex(byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1){
                hs = hs + "0" + stmp;
            } else{
                hs = hs + stmp;
            }
        }
        return hs.toUpperCase();
    }

    public static byte[] hex2byte(byte[] b) {
        if ((b.length % 2) != 0){
            throw new IllegalArgumentException("长度不是偶数");
        }
        byte[] b2 = new byte[b.length / 2];
        for (int n = 0; n < b.length; n += 2) {
            String item = new String(b, n, 2);
            b2[n / 2] = (byte) Integer.parseInt(item, 16);
        }
        return b2;
    }

    /**
     * 解密
     *
     * @param data
     * @return
     * @throws Exception
     */
    public final static String decrypt(String data,String key) {
        try {
            return new String(decrypt(hex2byte(data.getBytes()),key));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 加密
     *
     * @param data
     * @return
     * @throws Exception
     */
    public final static String encrypt(String data,String key) {
        try {
            return byte2hex(encrypt(data.getBytes(), key));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 生成一个16位的随机字符串
     * @return
     */
    public static String getKey(){
        StringBuffer sb = new StringBuffer();
        int len = string.length();
        for (int i = 0; i < 16; i++) {
            sb.append(string.charAt(getRandom(len-1)));
        }
        return sb.toString();
    }

    private static int getRandom(int count){
        return (int) Math.round(Math.random() * (count));
    }

    public static void main(String[] args) {
        String content = "{\n" +
                "  \"paName\":\"18682471096\",\n" +
                "  \"paPassword\":\"12345a\"\n" +
                "}";
        String key ="GIMIkejiGIMIkeji";
        String idEncrypt = encrypt(content,key);
        System.out.println(idEncrypt);
        String idDecrypt = decrypt(idEncrypt,key);
        System.out.println(idDecrypt);
    }
}